package com.javacoo.limit.client.api;

import java.util.concurrent.TimeUnit;

import com.google.common.collect.ImmutableList;
import com.javacoo.limit.client.config.LimitConfig;
import com.javacoo.xkernel.spi.Spi;

/**
 * 限流接口
 * <p>说明:</p>
 * <li></li>
 * @author duanyong
 * @date 2021/5/6 22:25
 */
@Spi(LimitConfig.DEFAULT_IMPL)
public interface RateLimiter {
    /** 默认时间单位:秒 */
    TimeUnit DEFAULT_TIME_UNIT = TimeUnit.SECONDS;
    /** 默认限流时间范围:1 */
    int DEFAULT_PERIOD = 1;
    /** 默认限流数量: 10 */
    int DEFAULT_LIMIT_COUNT = 10;
    /**
     * 尝试获取
     * <p>说明:</p>
     * <li></li>
     * @author duanyong
     * @date 2021/5/6 23:09
     * @param keys key
     * @param count 限制数量
     * @return boolean 是否成功
     */
    boolean tryAcquire(ImmutableList<String> keys ,int count);
    /**
     * 尝试获取
     * <p>说明:</p>
     * <li></li>
     * @author duanyong
     * @date 2021/5/7 23:09
     * @param keys key
     * @param count 限制数量
     * @param period 时间周期
     * @return boolean 是否成功
     */
    boolean tryAcquire(ImmutableList<String> keys ,int count,int period);
    /**
     * 尝试获取
     * <p>说明:</p>
     * <li></li>
     * @author duanyong
     * @date 2021/5/7 23:09
     * @param keys key
     * @param count 限制数量
     * @param period 时间周期
     * @param timeUnit 时间周期单位
     * @return boolean 是否成功
     */
    boolean tryAcquire(ImmutableList<String> keys ,int count,int period,TimeUnit timeUnit);
}
